import java.util.Arrays;
import java.util.PriorityQueue;

public class TopkProblem {
    public int[] smallestK(int[] arr, int k) {
        // 创建最小堆（默认）
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();

        // 遍历数组，将所有元素加入最小堆（O(n log n)）
        for (int i = 0; i < arr.length; i++) {
            minHeap.offer(arr[i]);
        }

        // 创建结果数组
        int[] ret = new int[k];

        // 从堆中取出前k个最小元素（O(k log n)）
        for (int i = 0; i < k; i++) {
            ret[i] = minHeap.poll();// 取出堆顶元素（当前最小值）
        }

        return ret;
    }
    public static void main(String[] args) {
        int[] arr = {4, 2, 1, 5, 3};
        int k = 3;

        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        for (int num : arr) {
            minHeap.offer(num);
        }

        int[] result = new int[k];
        for (int i = 0; i < k; i++) {
            result[i] = minHeap.poll();
            System.out.println("取出 " + result[i] + " → 剩余堆: " + minHeap);
        }

        System.out.println("最终结果: " + Arrays.toString(result));
    }
}
